图书使用国际标准书号(International Standard Book Number (ISBN-10))来编码,是一个 10 位码。前 9 位(0−9之间的数字)分别用于表示语言、出版商和 图书信息。第 10 位是校验位,可以是0−9之间的数字或者是字母 X (用于表示数字10);

ISBN-10码可以通过下面方法进行验证:

  1. 首先,对ISBN-10码的各个位按下面的计算式求和: 1×x1+2×x2+3×x3+4×x4⋯+9×x9+10×x10
  2. 将求和的结果对11取余数,如果余为0,则说明该ISBN-10码是一个有效码,否则,就不是一个有效的ISBN-10码。

现输入一批ISBN-10图书编码,请你验证该编码是否是有效的国际标准书号。

输入格式:

输入第一行给出正整数N(≤10)是输入的ISBN-10图书编号的个数。随后N行,每行给出1个10位的ISBN-10图书编号。

输出格式:

按照输入的顺序每行输出1个有问题的ISBN-10编码。这里并不检验前9位是否合理,只检查前9位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出 All passed

输入样例01:

1
2
1
0072880082

输出样例01:

1
All passed

输入样例02:

1
2
3
2
0072880082
084930149X

输出样例02:

1
084930149X

输入样例03:

1
2
3
4
3
013168728X
X615880991
026201A530

输出样例03:

1
2
X615880991
026201A530

思路

1.判定格式:前九位必须为数字,第十位为数字或者字母X

2.格式正确后按题中所给方式求和,结果对11取余数,如果余为0则为有效码,否则无效输出该码。

3.若所有码有效输出ALL passed。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int n,flag=1;
cin>>n;
for(int i=0;i<n;i++){
string s;
cin>>s;
int sum=0,flag1=1;
for(int j=0;j<10;j++){
if(isdigit(s[j])) sum=sum+(s[j]-'0')*(j+1);//isdigit判断字符是否为数字,C++库自带函数
else if(s[j]=='X'&&j==9) sum=sum+10*(j+1);
else flag1=0;
}
if(flag1){
sum=sum%11;
if(sum!=0) flag1=0;
}
if(!flag1) cout<<s<<endl,flag=0;
}
if(flag) cout<<"All passed"<<endl;
return 0;
}